package com.y.game.emtity;

import java.awt.Color;
import java.awt.Graphics;

import com.y.game.util.Util;

/**
 * 障碍物类 接收 Shape 使其成为障碍物一部分
 */
public class Ground {

	private int[][] obstacle = new int[Util.GAMEPANEL_SIZE[0]][Util.GAMEPANEL_SIZE[1]];
	
	public void accept(Shape shape) {
//System.out.println("Ground accept shape");
	
		// shape 为 1 的地方 ground 也设置为 1 
		for(int x=0; x<4; x++) {
			for(int y=0; y<4; y++) {
				if(shape.isOneFalg(x, y, false)) {
					obstacle[shape.getLeftCellNum() + x][shape.getTopCellNum() + y] = 1;
				}
			}
		}
		
		this.deleteFullRow();
	}
	
	// 画出格子
	private void myDrawLine(Graphics g) {
		Color c = g.getColor();
		g.setColor(Util.LINE_COLOR);
		
		for(int x=0; x<Util.GAMEPANEL_SIZE[0]; x++) {
			g.drawLine(x * Util.CELL_SIZE, 0, x * Util.CELL_SIZE, Util.GAMEPANEL_SIZE[1] * Util.CELL_SIZE);
		}
		for(int y=0; y<Util.GAMEPANEL_SIZE[1]; y++) {
			g.drawLine(0, y * Util.CELL_SIZE, Util.GAMEPANEL_SIZE[0] * Util.CELL_SIZE, y * Util.CELL_SIZE);
		}
		
		g.setColor(c);
	}

	// 画出障碍物
	public void drawMe(Graphics g) {
//System.out.println("Ground drawMe");
	
		//this.myDrawLine(g);
		
		Color c = g.getColor();
		g.setColor(Util.OBSTACLE_COLOR);
		
		for(int x=0; x<Util.GAMEPANEL_SIZE[0]; x++) {
			for(int y=0; y<Util.GAMEPANEL_SIZE[1]; y++) {
				if(obstacle[x][y] == 1) {
					g.fill3DRect(x * Util.CELL_SIZE, y * Util.CELL_SIZE, 
							Util.CELL_SIZE, Util.CELL_SIZE, true);
				}
			}
		}
		
		g.setColor(c);
	}

	/**
	 * 判断图形下一个动作是否可以移动 <br />
	 * 就是检查数组 1 的位置是否超出界限
	 * 
	 * @param shape 形状
	 * @param action 向哪个方向移动
	 * @param isRotated 是否变形了
	 * @return
	 */
	public boolean isMoveable(Shape shape, int action) {
		// 先得到下一个位置
		int leftCellNum = shape.getLeftCellNum();
		int topCellNum = shape.getTopCellNum();
		switch (action) {
		case Shape.MOVERIGHT:
			leftCellNum++;
			break;
		case Shape.MOVEDOWN:
			topCellNum++;
			break;
		case Shape.MOVELEFT:
			leftCellNum--;
			break;
		}

		// 判断 1 的位置是否超出界限
		for (int x=0; x<4; x++) {
			for (int y=0; y<4; y++) {
				if (shape.isOneFalg(x, y, action == Shape.ROTATE)) {
					// 判定底部超限 左右超限
					// 注意 x y 从 0 起计数 所以判断条件中有等号
					// 但是 往左侧移动不受 0 影响 所以 左移判断不包含等号
					if (topCellNum + y >= Util.GAMEPANEL_SIZE[1]
							|| leftCellNum + x >= Util.GAMEPANEL_SIZE[0]
							|| leftCellNum + x < 0
							|| obstacle[leftCellNum + x][topCellNum + y] == 1) {
						return false;
					}
				}
			}
		}

		return true;
	}
	
	private void deleteFullRow() {
		// 从底部到顶部判断
		for(int y=Util.GAMEPANEL_SIZE[1] - 1; y>=0; y--) {
			// 整行都是 1 才删除该行
			boolean flag = true;
			for(int x=0; x<Util.GAMEPANEL_SIZE[0]; x++) {
				if(obstacle[x][y] != 1) {
					flag = false;
					break;
				}
			}
			
			if(flag) {
				// 删除该行 就是让该行的值都等于上一行 这样就相当于下移了
				for(int j = y; j > 0; j--) {
					for(int k=0; k<Util.GAMEPANEL_SIZE[0]; k++)
					obstacle[k][j] = obstacle[k][j-1];
				}
				// 最后把最顶上一行全部设置为 0
				for(int z=0; z<Util.GAMEPANEL_SIZE[0]; z++) {
					obstacle[z][0] = 0;
				}
			}
		}
	}
}
